home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <libc.h>
- #include "bmp.h"
- #include "save.h"
-
- static void saveBmpHeader(FILE *fp, commonInfo *cinf, int bits, paltype *pal)
- {
- int i;
- unsigned char *p;
- int colors = 1 << bits;
-
- putc('B', fp);
- putc('M', fp);
- put_long(0, fp); /* Hot Spot */
- put_long(0, fp);
- put_long((bits == 24)? 54 : (54 + colors * 4), fp);
- put_long(WIN3, fp);
- put_long((long)cinf->width, fp);
- put_long((long)cinf->height, fp);
- put_short(1, fp); /* plane */
- put_short(bits, fp);
- put_long(0, fp); /* compression */
- put_long(0, fp);
- put_long(0, fp); /* Pixels/Meter */
- put_long(0, fp);
- put_long(colors, fp); /* colors */
- put_long(colors, fp);
-
- if (bits != 24) {
- for (i = 0; i < colors; i ++) {
- p = pal[i];
- putc(p[BLUE], fp);
- putc(p[GREEN], fp);
- putc(p[RED], fp);
- putc(0, fp);
- }
- }
- }
-
- int saveBmpbmap(FILE *fp, commonInfo *cinf,
- int cnum, paltype *pal, unsigned char **planes)
- {
- int x, y, r, g, b;
- int cnt, bits;
-
- bits = (cnum <= 2) ? 1 :((cnum <= 16) ? 4 : 8);
- if (pal) {
- saveBmpHeader(fp, cinf, bits, pal);
- for (y = cinf->height - 1; y >= 0; y--) {
- cnt = 0;
- resetPixel(planes, y);
- if (cnum <= 2) {
- int cc, mask;
- for (x = 0; x < cinf->width; x += 8, cnt++) {
- cc = 0;
- for (mask = 0x80; mask; mask >>= 1) {
- (void) getPixel(&r, &g, &b);
- if (mapping(r, g, b))
- cc |= mask;
- }
- putc(cc, fp);
- }
- }else if (cnum <= 16) {
- int cc, dd;
- for (x = 0; x < cinf->width; x++, cnt++) {
- (void) getPixel(&r, &g, &b);
- cc = (mapping(r, g, b) << 4) & 0xf0;
- if (++x >= cinf->width) dd = 0;
- else {
- (void) getPixel(&r, &g, &b);
- dd = mapping(r, g, b) & 0x0f;
- }
- putc((cc|dd), fp);
- }
- }else { /* 8 bits */
- for (x = 0; x < cinf->width; x++, cnt++) {
- (void) getPixel(&r, &g, &b);
- putc(mapping(r, g, b), fp);
- }
- }
- while (cnt & 0x03) {
- putc(0, fp);
- cnt++;
- }
- }
- }else { /* full color */
- saveBmpHeader(fp, cinf, 24, pal);
- for (y = cinf->height - 1; y >= 0; y--) {
- resetPixel(planes, y);
- for (x = 0; x < cinf->width; x++) {
- (void) getPixel(&r, &g, &b);
- putc(b, fp);
- putc(g, fp);
- putc(r, fp);
- }
- for (x *= 3 ; x & 0x03; x++)
- (void) getc(fp);
- }
- }
- return 0;
- }
-